#include "net.hpp"
#include "dispatcher.hpp"

void onMessage(const jsonrpc::BaseConnection::ptr& conn , jsonrpc::BaseMessage::ptr& msg)
{
    using std::cout;
    using std::endl;

    // 测试rpc调用
    std::string body = msg->serialize();
    cout << body << endl;

    // 构造响应
    auto rpc_rsp = jsonrpc::MessageFactory::create<jsonrpc::RpcResponse>();
    rpc_rsp->setId("123456");
    rpc_rsp->setMType(jsonrpc::MType::RSP_RPC);
    rpc_rsp->setRCode(jsonrpc::RCode::RCODE_OK);
    rpc_rsp->setResult(33);

    // 返回结果
    conn->send(rpc_rsp);
}

void test_server_common()
{
    auto server = jsonrpc::ServerFactory::create(9090);
    server->setMessageCallback(onMessage);
    server->start();
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// 不足: 访问一个请求里的所有元素, 需要用到子类
void onRpcReq(const jsonrpc::BaseConnection::ptr& conn, jsonrpc::RpcRequest::ptr& msg)
{
    using std::cout; using std::endl;
    std::cout << "收到RPC请求" << std::endl;

    // 测试rpc调用
    std::string body = msg->serialize();
    cout << body << endl;

    // 构造响应
    auto rpc_rsp = jsonrpc::MessageFactory::create<jsonrpc::RpcResponse>();
    rpc_rsp->setId("123456");
    rpc_rsp->setMType(jsonrpc::MType::RSP_RPC);
    rpc_rsp->setRCode(jsonrpc::RCode::RCODE_OK);
    rpc_rsp->setResult(33);

    // 返回结果
    conn->send(rpc_rsp);
}

void onTopicReq(const jsonrpc::BaseConnection::ptr& conn, jsonrpc::TopicRequest::ptr& msg)
{
    using std::cout; using std::endl;
    std::cout << "收到Topic请求" << std::endl;

    // 测试Topi调用
    std::string body = msg->serialize();
    cout << body << endl;

    // 构造响应
    auto topic_rsp = jsonrpc::MessageFactory::create<jsonrpc::TopicResponse>();
    topic_rsp->setId("123456");
    topic_rsp->setMType(jsonrpc::MType::RSP_TOPIC);
    topic_rsp->setRCode(jsonrpc::RCode::RCODE_OK);

    // 返回结果
    conn->send(topic_rsp);
}


void test_dispatcher()
{
    // 在之前的基础上, 加一个dispatcher
    auto dispatcher = std::make_shared<jsonrpc::Dispatcher>();
    // 1.1注册映射关系
    dispatcher->registerHandler<jsonrpc::RpcRequest>(jsonrpc::MType::REQ_RPC, onRpcReq); 
    dispatcher->registerHandler<jsonrpc::TopicRequest>(jsonrpc::MType::REQ_TOPIC, onTopicReq); 
    // 1.2设置dispatcher里的onMessage为回调函数, 收到消息后, 回根据我们注册的消息类型, 找到对应的回调函数并调用
    auto message_cb = std::bind(&jsonrpc::Dispatcher::onMessage, dispatcher.get(), 
                                                     std::placeholders::_1, std::placeholders::_2);

    auto server = jsonrpc::ServerFactory::create(9090);
    server->setMessageCallback(message_cb);

    // 2.监听消息
    server->start();
}
int main()
{
    test_dispatcher();
    return 0;
}